home *** CD-ROM | disk | FTP | other *** search
- {
- From: randyd@alpha2.csd.uwm.edu (Randall Elton Ding)
-
- >How do you get an Epson-compatible 24-pin printer to print graphics?
- >Printing text is simple... just open the appropriate LPT port and
- >redirect text into it.
- >
- >I suppose if I had a manual for the printer I could find out what any of
- >the escape codes are.
-
- Here is a routine I wrote years ago
- for my old Epson MX-100 (made in early 80's)
- You should get some ideas from this program, it may even be capable
- of being modified to work with your printer.
- I don't know if the escape codes are the same, you'll have to
- look them up. BTW, this printer is a 9 pin and only 8 are used.
- Thats convenient because each print head pass generates 8 pixils high
- per character sent. I don't know how your 24 pin works.
- }
-
- program develop; { developed for Epson MX-100 and EGA screen }
-
- uses graph;
-
- const
- rotate90= true;
- widepaper= false;
- bgipath: string = 'e:\bp\bgi';
-
-
- procedure initbgi;
- var
- errcode,grdriver,grmode: integer;
-
- begin
- grdriver := Detect;
- initgraph(grdriver,grmode,bgipath);
- errcode:= graphresult;
- if errcode <> grok then begin
- writeln('Graphics error: ',grapherrormsg (errcode));
- halt(1);
- end;
- end;
-
-
-
- procedure developgraph(rotate: boolean);
- { if passed parameter is true, the graphics
- image will be rotated 90 degrees to fit on
- a narrow sheet of printer paper, if false
- the image will completely fill the wide
- paper erect and double height }
-
- const maxprinter = 816; { maximum width of printer }
-
- var
- graphwidth,graphheight,printerwidth,printerheight: integer;
- n1,n2,sx,sy,x,y,y2,pixcolr: integer;
- widthratio,heightratio: real;
- blank: boolean;
- bitloc,bits: byte;
- bytes: array [1..maxprinter] of byte;
- lst: text;
-
- begin
- assign(lst,'lpt1');
- rewrite(lst);
- case rotate of
- widepaper: begin { develop erect on wide paper }
- graphwidth:= getmaxx+1;
- graphheight:= getmaxy+1;
- printerwidth:= maxprinter; { scale 1.275 x 2 }
- printerheight:= graphheight*2;
- end;
- rotate90: begin { if rotate then reverse x and y }
- graphwidth:= getmaxy+1;
- graphheight:= getmaxx+1;
- printerwidth:= graphwidth; { scale 1 x 1 }
- printerheight:= graphheight;
- end;
- end;
- n2:= printerwidth div 256;
- n1:= printerwidth mod 256;
- write(lst,chr(27),'A',chr(8)); { set line spacing to 8 }
- widthratio:= printerwidth/graphwidth;
- heightratio:= printerheight/graphheight;
- y:= 0;
- while y < printerheight do begin
- blank:= true; { remains true if entire printer pass is blank }
- for x:= 1 to printerwidth do begin
- sx:= trunc((x-1)/widthratio); { screen x coorid }
- bits:= 0;
- bitloc:= $80;
- for y2:= y to y+7 do begin
- sy:= trunc(y2/heightratio); { screen y coorid }
- if sy < graphheight then begin { last printer pass is incomplete }
- case rotate of
- widepaper: pixcolr:= getpixel(sx,sy);
- rotate90: pixcolr:= getpixel(sy,sx); { x and y swaped }
- end;
- if pixcolr > 0 then bits:= bits or bitloc;
- end;
- bitloc:= bitloc shr 1;
- end;
- case rotate of
- widepaper: bytes[x]:= bits;
- rotate90: bytes[printerwidth-x+1]:= bits; { reverse image }
- end;
- if bits > 0 then blank:= false; { have something to print this pass }
- end;
- if not blank then begin { line feed if nothing to print this pass }
- write (lst,chr(27),'K',chr(n1),chr(n2)); { set printer graph mode }
- for x:= 1 to printerwidth do write (lst,chr(bytes[x]));
- end;
- writeln(lst); { output 8 printer pixels high per pass }
- y:= y+8;
- end;
- write(lst,chr(12)); { top of form }
- write(lst,chr(27),'@'); { re-initalize printer }
- close(lst);
- end;
-
-
- begin
- initbgi;
-
- { your graphics code here }
- Line(100,100,200,100);
- Line(200,100,200,100);
- Line(100,200,200,100);
- Line(100,100,200,200);
- SetColor(Blue);
- Circle(300,200,50);
-
- developgraph(rotate90); { or use (widepaper) }
- end.
-